package com.wh.wisdomsite.xbox.utils.tree;

import com.wh.wisdomsite.xbox.utils.StringUtils;
import com.wh.wisdomsite.xbox.utils.tree.model.ENode;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 构建EasyUI属性结构实体模型
 * @Package com.wh.wisdomsite.xbox.utils.tree.model
 * @author 谢泽鹏
 * @date 2014年10月8日 下午4:02:14
 * @Copyright 个人版权所有
 * @Company 贵州万华科技有限公司Copyright (c) 2014
 * @version V1.0
 */
public class EasyUITree implements Serializable {

    private static final Log logger = LogFactory.getLog(EasyUITree.class);

    /**
     * 获取取树形结构
     * 调用案例： new EasyUITree().getTree(objList, 0);
     *
     * @param eNodes   数据集合
     * @param parentId 父级Id
     * @return
     */
    public static String getTree(List<ENode> eNodes, Integer parentId) {
        StringBuffer buf = new StringBuffer();
        buf.append("[");
        iterGet(eNodes, parentId, buf);
        buf.append("]");
        return buf.toString().replaceAll(",\n]", "\n]");
    }


    /**
     *
     * 获取取树形结构
     * 调用案例：new EasyUITree().getTree(eNodes, 0, "officeId", "parentId", "name", "");
     *
     * @param eNodes         数据集合
     * @param rootId         查找根节点，通常指0或-1根节点
     * @param filedId        字段主键id名称
     * @param filedParentId  字段从属parnetId名称
     * @param filedName      字段文本名称
     * @param filedIcon      字段图标名称
     * @return
     */
    public List<ENode> getTree(List<Object> eNodes, Integer rootId, String filedId, String filedParentId, String filedName, String filedIcon) {
        List<ENode> eNodeList = new ArrayList<>();
        for (Object object : eNodes) {
            Integer id = (Integer) getFieldValue(object, filedId);
            Integer parentId = (Integer) getFieldValue(object, filedParentId);
            String text = (String) getFieldValue(object, filedName);
            String iconCls = StringUtils.isNotEmpty(filedIcon) ? (String) getFieldValue(object, filedIcon) : "";
            if (rootId == parentId) {
                ENode eNode = new ENode();
                eNode.setId(id);
                eNode.setText(text);
                eNode.setIconCls(iconCls);
                eNode.setChildren(getTree(eNodes, id, filedId, filedParentId, filedName, iconCls));
                eNodeList.add(eNode);
            }
        }
        return eNodeList;
    }



    /**
     * 获取取树形Datagrid结构
     * 调用案例：new EasyUITree().getTreeDatagrid(listObjets, 0, "officeId", "parentId", "name", "", [{"compyId", "x"} ])
     *
     * @param listObjets     集合数据
     * @param rootId         查找根节点，通常指0或-1根节点
     * @param filedId        字段主键id名称
     * @param filedParentId  字段从属parnetId名称
     * @param filedName      字段文本名称
     * @param filedIcon      字段图标名称
     * @return
     */
    public <T> Object getTreeDatagrid(List<T> listObjets, Integer rootId, String filedId, String filedParentId, String filedName, String filedIcon, String [] arrays) {
        List<Map<String,Object>> treeList = new ArrayList<>();
        for (T object : listObjets) {
            Map<String, Object> map = null;
            Integer id = (Integer) getFieldValue(object, filedId);
            Integer parentId = (Integer) getFieldValue(object, filedParentId);
            String text = (String) getFieldValue(object, filedName);
            String iconCls = StringUtils.isNotEmpty(filedIcon) ? (String) getFieldValue(object, filedIcon) : "";
            if (rootId == parentId) {
                map = new HashMap<>();
                map.put("id", id);
                map.put("text", text);
                map.put("iconCls", iconCls);
                for(int i = 0; i < arrays.length; i++ ){
                    map.put(arrays[i], (null == getFieldValue(object, arrays[i])) ? "" : getFieldValue(object, arrays[i]));
                }
                map.put("children", getTreeDatagrid(listObjets, id, filedId, filedParentId, filedName, filedIcon, arrays));
            }
            if (map != null)
                treeList.add(map);
        }
        return treeList;
    }


    /**
     * 递归调用算法
     * @param eNodes    数据集合
     * @param parentId  父级Id
     * @param buf       缓冲变量
     */
    public static void iterGet(List<ENode> eNodes, Integer parentId, StringBuffer buf) {
        for (ENode eNode : eNodes) {
            if (eNode.getParentId() == parentId){
                buf.append("{\"id\":\""+ eNode.getId() + "\",\"text\":\"" + eNode.getText() + "\",\"iconCls\":\""+ eNode.getIconCls() + "\",\"state\":\"" + (eNode.getState().equals("closed") ? "closed" : "open")+ "\",\"children\":[");
                iterGet(eNodes, eNode.getId(), buf);
                buf.append("]},\n");
            }
        }
    }


    /**
     *  通过属性名获取值
     * @param object  查找对象
     * @param field   字段名
     * @return
     */
    @SuppressWarnings("rawtypes")
    private Object getFieldValue(Object object, String field) {
        try {
            Class clazz = object.getClass();
            PropertyDescriptor pd = new PropertyDescriptor(field, clazz);
            Method method = pd.getReadMethod();
            return method.invoke(object);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("getFieldValue 异常： " + e.getMessage());
        }
        return null;
    }












}
